const _ = require('lodash')
/* function sum(a, b, c, d) {
  return a + b + c + d
} */
// sum(1, 2, 3, 4)
// 需求：sum(1)(2)(3)(4) 也能拿到 10，怎么做？

/* function sum(a) {
  return (b) => (c) => (d) => a + b + c + d
}
console.log(sum(1)(2)(3)(4)) */

function sum(a, b, c, d) {
  return a + b + c + d
}
// curry: 能把普通函数变成柯里化的形式进行调用
// const sumTemp = _.curry(sum)

function curry(fn) {
  // 函数参数的长度
  const len = fn.length // 4
  return function temp(...args) {
    if (args.length >= len) {
      return fn(...args)
    } else {
      return function (...args2) {
        return temp(...args, ...args2)
      }
    }
  }
}

const sumTemp = curry(sum)

// 真正的需求是这样的！
console.log(sumTemp(1, 2, 3, 4))
console.log(sumTemp(1)(2, 3, 4))
console.log(sumTemp(1)(2)(3)(4))
console.log(sumTemp(1, 2)(3, 4))

// 柯里化很重要的一个作用：参数复用

function heima(school, classs, xingming) {
  console.log(`${school}的${classs}的${xingming}`)
}
/* heima('黑马', 67, '王沙')
heima('黑马', 67, '杨康')
heima('黑马', 67, '昊天') */

const itheima = curry(heima)
const fn = itheima('黑马', 67)
fn('王沙')
fn('杨康')
fn('昊天')
